使用 nginx 对 docker registry 进行 mesh
需求
推送镜像时,根据不同的 header 推送到不同的仓库
伪代码
package image
// Param 输入参数
type Param struct {
Src Entry `json:"src"`
Dest Entry `json:"dest"`
// 代理域名,通过这个代理域名,向 Dest 仓库推送镜像
ProxyDomain string `json:"proxy_domain"`
}
// Transfer ...
func Transfer(param Param, annos ...map[string]string) error {
var transport = http.DefaultTransport.(*http.Transport).Clone()
transport.TLSClientConfig = &tls.Config{
InsecureSkipVerify: true,
}
var roundTripper http.RoundTripper = transport
// proxy from dev to product
if param.ProxyDomain != "" {
index := strings.Index(param.Dest.Image, "/")
imageName := param.Dest.Image[index+1:]
originDstDomain := param.Dest.Image[:index]
param.Dest.Image = fmt.Sprintf("%s/%s", param.ProxyDomain, imageName)
roundTripper = &ProxyTransport{Transport: transport, domain: originDstDomain}
}
var err error
var srcImage gcrv1.Image
{ // 1. pull image
var srcOptions []crane.Option
srcOptions = append(srcOptions, crane.WithTransport(roundTripper))
srcOptions = append(srcOptions, crane.Insecure)
srcImage, err = crane.Pull(param.Src.Image, srcOptions...)
if err != nil {
return err
}
}
{ // 2. push image
var destOptions []crane.Option
destOptions = append(destOptions, crane.WithTransport(roundTripper))
destOptions = append(destOptions, crane.Insecure)
err = crane.Push(srcImage, param.Dest.Image, destOptions...)
}
return err
}